With a multi-threaded processor, multiple threads of execution exist within the context of each process. The threads of a particular process are executed in a manner in which the processor quickly switches between different threads such that it appears that threads are being simultaneously executed. A simple type of multi-threading is where one thread runs until an event, such as a cache-miss that has to access off-chip memory, which might create a long latency. Rather than waiting, the processor switches to another thread that is ready to run. When the data for the previous thread arrives, the previous thread is placed back on the list of ready-to-run threads. In another type of multi-threading, the processor switches threads every CPU cycle.
Each process is allocated resources such as registers by the operating system, and such resources are allocated to the process' threads such that each thread owns its own resources, which are used when a thread is employed to execute an instruction. When a process is created, it is stored in main memory. Once the kernel assigns the process to a processor, the process is loaded into the processor and the processor executes the process's instructions using its resources.
A thread arbiter and/or thread priority determines which thread of execution to use to execute an instruction, and a thread identifier (ID) is associated with and follows the instruction through its various states of execution. The instruction is executed using the resources, such as the registers, of the thread that corresponds to the thread ID. When switching threads, the thread arbiter or thread priority determines the next thread to employ, and a thread ID of the next thread is associated with and follows the next instruction through its various states of execution. Likewise, the instruction is executed using the resources of the thread that corresponds to the thread ID of the next thread.